/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package modelo.primitivas;

import modelo.primitivas.SegmentoLinea;
import modelo.primitivas.Punto;
import com.vividsolutions.jts.geom.Coordinate;
import com.vividsolutions.jts.geom.LineString;
import com.vividsolutions.jts.geom.GeometryFactory;
import java.util.*;
    
/**
 *
 * @author Diego
 */
public class PoliLinea {

    private LineString poli;

    public PoliLinea()
    {
    }

    public PoliLinea(List<Punto> puntos)
    {
        GeometryFactory geom = new GeometryFactory();
        poli = geom.createLineString(Punto.puntosToArrayCoordinates(puntos));
    }
    
    public LineString getPoliLinea()
    {
        return poli;
    }
    
    public void setPoliLinea(LineString pPoli)
    {
        poli=pPoli;
    }

    public void imprimirPoliLinea(String etiqueta)
    {
        System.out.print("["+etiqueta+"] ->");
        Coordinate[] recorrido = poli.getCoordinates();
        String separador = "";
        for(int i=0;i<recorrido.length;i++)
        {
            System.out.print(separador);
            new Punto(recorrido[i]).imprimirPunto();
            separador = " ; ";
        }
        System.out.println();
    }

    public boolean esArea()
    {
        return poli.isRing();
    }

    public boolean esIgual(PoliLinea pPoli)
    {
        return poli.equals(pPoli.getPoliLinea());
    }

    public static PoliLinea toPoliLinea(List<SegmentoLinea> pSegmento)
    {
        List<Punto> puntos = new ArrayList<Punto>();
        if(pSegmento.size()>1)
        {
            Punto anterior=null;
            SegmentoLinea nuevo1 = pSegmento.get(0);
            SegmentoLinea nuevo2 = pSegmento.get(1);
            if(!nuevo1.getOrigen().esIgual(nuevo2.getOrigen())&&!nuevo1.getOrigen().esIgual(nuevo2.getFin()))
            {
                puntos.add(nuevo1.getOrigen());
                puntos.add(nuevo1.getFin());
                anterior = nuevo1.getFin();
            }
            else
            {
                puntos.add(nuevo1.getFin());
                puntos.add(nuevo1.getOrigen());
                anterior = nuevo1.getOrigen();
            }
            
            for(int i = 1; i<pSegmento.size();i++)
            {
                SegmentoLinea nueva = pSegmento.get(i);
                if(anterior.esIgual(nueva.getOrigen()))
                {
                    puntos.add(nueva.getFin());
                    anterior = nueva.getFin();
                }
                else
                {
                    puntos.add(nueva.getOrigen());
                    anterior = nueva.getOrigen();
                }
            }
        }
        else if(pSegmento.size()==1)
        {
            SegmentoLinea nueva = pSegmento.get(0);
            puntos.add(nueva.getOrigen());
            puntos.add(nueva.getFin());
        }
        PoliLinea lPoli = new PoliLinea(puntos);
        return lPoli;
    }

    public Set<Punto> toConjuntoPuntos()
    {
        Coordinate[] coordenadas =  poli.getCoordinates();
        Set<Punto> puntos = new HashSet<Punto>();
        for(int i=0;i<coordenadas.length;i++)
        {
            Punto nuevo = new Punto(coordenadas[i]);
            if(!Punto.existeEnConjuntoPuntos(puntos, nuevo))
                puntos.add(nuevo);

        }
        return puntos;
    }

    public String toString(String etiqueta){
        String resultado = "["+etiqueta+"] ->";
        Coordinate[] recorrido = poli.getCoordinates();

        for(int i=0;i<recorrido.length;i++)
        {
            resultado += "(" + new Punto(recorrido[i]).getCoordenadaX() + "," + new Punto(recorrido[i]).getCoordenadaY()+")";
            if(i<recorrido.length-1){
                resultado += ";";
            }
        }
        return resultado;
    }

    public static boolean existeEnListadoArcos(List<ArcoDirigido> conjuntoArcos,ArcoDirigido pArco)
    {
        Iterator<ArcoDirigido> recorrido = conjuntoArcos.iterator();
        while(recorrido.hasNext())
        {
            ArcoDirigido comprobar = recorrido.next();
            if(comprobar.esIgual(pArco))
            {
                return true;
            }
        }
        return false;
    }

    public static void imprimirListadoPolilineas(List<PoliLinea> pListado,String titulo)
    {
        System.out.println(titulo);
        for(int i = 0; i <pListado.size(); i++)
        {
            pListado.get(i).imprimirPoliLinea(String.valueOf(i+1));
        }
    }
}
